{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Mandelbrot"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Vectorized mandelbrot set\n",
    "\n",
    "Mandelbrot code inspired from [NumPy: Compute Mandelbrot set by Vectorization](https://www.learnpythonwithrune.org/numpy-compute-mandelbrot-set-by-vectorization/), \n",
    "by @PythonWithRune"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# mandelbrot vectorized function definition\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "def mandelbrot(height, width, x=-0.5, y=0, zoom=1, max_iterations=100):\n",
    "    # To make navigation easier we calculate these values\n",
    "    x_width = 1.5\n",
    "    y_height = 1.5 * height / width\n",
    "    x_from = x - x_width / zoom\n",
    "    x_to = x + x_width / zoom\n",
    "    y_from = y - y_height / zoom\n",
    "    y_to = y + y_height / zoom\n",
    "    # Here the actual algorithm starts\n",
    "    x = np.linspace(x_from, x_to, width).reshape((1, width))\n",
    "    y = np.linspace(y_from, y_to, height).reshape((height, 1))\n",
    "    c = x + 1j * y\n",
    "    # Initialize z to all zero\n",
    "    z = np.zeros(c.shape, dtype=np.complex128)\n",
    "    # To keep track in which iteration the point diverged\n",
    "    div_time = np.zeros(z.shape, dtype=int)\n",
    "    # To keep track on which points did not converge so far\n",
    "    m = np.full(c.shape, True, dtype=bool)\n",
    "    for i in range(max_iterations):\n",
    "        z[m] = z[m] ** 2 + c[m]\n",
    "        diverged = np.greater(np.abs(z), 2, out=np.full(c.shape, False), where=m)  # Find diverging\n",
    "        div_time[diverged] = i  # set the value of the diverged iteration number\n",
    "        # m[np.abs(z) > 2] = False    # to remember which have diverged\n",
    "        m[diverged] = False\n",
    "    return div_time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Show plot of mandelbrot via matlplotlib\n",
    "plt.imshow(mandelbrot(800, 1000), cmap=\"magma\")\n",
    "# The image below of Mandelbrot set\n",
    "# plt.imshow(mandelbrot(800, 1000, -0.75, 0.0, 2, 200), cmap='magma')\n",
    "# The image below of below of Mandelbrot set\n",
    "# plt.imshow(mandelbrot(800, 1000, -1, 0.3, 20, 500), cmap='magma')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GlProviderSentinel __init__: calling immvision.InitGlProvider()\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "UserWarning: Using SDL2 binaries from pysdl2-dll 2.0.20\n",
      "2022-05-04 00:57:56.805 Python[61703:5147502] ApplePersistenceIgnoreState: Existing state will not be touched. New state will be written to /var/folders/hj/vlpl655s0gz58f0tfgghv0g40000gn/T/org.python.python.savedState\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cpp: SetImGuiContextFrom_pyimgui_Context detected null context!\n",
      "cpp: SetImGuiContextFrom_pyimgui_Context(0x7fce03ac3800) (got pointer from Python)\n",
      "Python GenTexture()\n"
     ]
    }
   ],
   "source": [
    "# Show mandelbrot with immvision\n",
    "import imgui\n",
    "import immvision.imgui_runner\n",
    "import immvision\n",
    "\n",
    "ax = plt.imshow(mandelbrot(800, 1000), cmap=\"magma\")\n",
    "immvision.imgui_runner.run(lambda: immvision.figure_display(ax.figure))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'mandelbrot' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m/Users/pascal/dvp/OpenSource/ImGuiWork/immvision/pybind/pybind_examples/mandelbrot.ipynb Cell 6'\u001b[0m in \u001b[0;36m<cell line: 8>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/pascal/dvp/OpenSource/ImGuiWork/immvision/pybind/pybind_examples/mandelbrot.ipynb#ch0000009?line=4'>5</a>\u001b[0m zoom \u001b[39m=\u001b[39m \u001b[39m1.\u001b[39m\n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/pascal/dvp/OpenSource/ImGuiWork/immvision/pybind/pybind_examples/mandelbrot.ipynb#ch0000009?line=5'>6</a>\u001b[0m max_iterations \u001b[39m=\u001b[39m \u001b[39m100\u001b[39m\n\u001b[0;32m----> <a href='vscode-notebook-cell:/Users/pascal/dvp/OpenSource/ImGuiWork/immvision/pybind/pybind_examples/mandelbrot.ipynb#ch0000009?line=7'>8</a>\u001b[0m image \u001b[39m=\u001b[39m mandelbrot(h, w, x\u001b[39m=\u001b[39mx, y\u001b[39m=\u001b[39my, zoom\u001b[39m=\u001b[39mzoom, max_iterations\u001b[39m=\u001b[39mmax_iterations)\n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/pascal/dvp/OpenSource/ImGuiWork/immvision/pybind/pybind_examples/mandelbrot.ipynb#ch0000009?line=8'>9</a>\u001b[0m image\u001b[39m.\u001b[39mshape\n",
      "\u001b[0;31mNameError\u001b[0m: name 'mandelbrot' is not defined"
     ]
    }
   ],
   "source": [
    "# Perf mandelbrot vectorized\n",
    "w, h = 800, 600\n",
    "x = -0.5\n",
    "y = 0.0\n",
    "zoom = 1.0\n",
    "max_iterations = 100\n",
    "\n",
    "image = mandelbrot(h, w, x=x, y=y, zoom=zoom, max_iterations=max_iterations)\n",
    "image.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Mandelbrot with Numba"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Try mandelbrot_numba standalone\n",
    "from mandelbrot import MandelbrotParams\n",
    "import numpy as np\n",
    "from PIL import Image\n",
    "\n",
    "params = MandelbrotParams()\n",
    "mandel_image = params.mandelbrot_image()\n",
    "\n",
    "# convert from float in [0, 1] to to uint8 in [0, 255] for PIL\n",
    "mandel_image = np.clip(mandel_image * 255, 0, 255).astype(np.uint8)\n",
    "mandel_image = Image.fromarray(mandel_image)\n",
    "mandel_image.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create an imgui app for mandelbrot\n",
    "from mandelbrot import MandelbrotApp\n",
    "\n",
    "app = MandelbrotApp()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pythonContextPointer differs from ImGui::GetCurrentContext()! The graphical app was perhaps restarted...\n",
      "Python GenTexture()\n",
      "Python GenTexture()\n",
      "Python GenTexture()\n",
      "Python GenTexture()\n",
      "Python GenTexture()\n",
      "Python GenTexture()\n",
      "Python DeleteTexture()\n",
      "Python DeleteTexture()\n",
      "Python DeleteTexture()\n",
      "Python DeleteTexture()\n",
      "Python DeleteTexture()\n",
      "Python DeleteTexture()\n"
     ]
    }
   ],
   "source": [
    "# Run the app\n",
    "app.run()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GlProviderSentinel __init__: calling immvision.InitGlProvider()\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "UserWarning: Using SDL2 binaries from pysdl2-dll 2.0.20\n",
      "2022-05-04 02:30:06.886 Python[64211:5218432] ApplePersistenceIgnoreState: Existing state will not be touched. New state will be written to /var/folders/hj/vlpl655s0gz58f0tfgghv0g40000gn/T/org.python.python.savedState\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cpp: SetImGuiContextFrom_pyimgui_Context detected null context!\n",
      "cpp: SetImGuiContextFrom_pyimgui_Context(0x7ff3eea05a00) (got pointer from Python)\n",
      "Python GenTexture()\n",
      "Python GenTexture()\n",
      "Python GenTexture()\n",
      "Python GenTexture()\n",
      "Python GenTexture()\n",
      "Python GenTexture()\n"
     ]
    }
   ],
   "source": [
    "# test immvision\n",
    "import cv2\n",
    "import immvision\n",
    "import immvision.imgui_runner\n",
    "\n",
    "m = cv2.imread(\"/Users/pascal/dvp/OpenSource/ImGuiWork/immvision/pybind/pybind_examples/house.jpg\")\n",
    "p = immvision.ImageParams(image_display_size=(400, 0))\n",
    "\n",
    "\n",
    "def gui2():\n",
    "\n",
    "    immvision.image(m, p)\n",
    "\n",
    "\n",
    "immvision.imgui_runner.run(gui2)"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "07580d44e519ada64faf1c79f750a40c45d7960b3526f627e875efade47c9e1b"
  },
  "kernelspec": {
   "display_name": "Python 3.9.12 ('venv': venv)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
